package hpp.meitu;

import java.io.*;
import java.util.Random;

/**
 * 假设uid表示用户编号，为int类型（>0）；mvId表示视频编号，也是int类型（>0）,现有需求如下：
 * 1、使用java相关随机函数模拟出10份给用户推荐视频的数据文件
 * 1）1行记录对应给一个用户的推荐信息，每个数据文件60W行。
 * 2）其中，每一行的格式为uid\tmvId|mvId...,即前面是uid,后面是mvId列表，其中uid和mvId列表之前用TAB键作为分隔符
 * 3）mvId列表之间使用|作为分隔符
 * 4）每条记录中的mvId不应该重复，且数量不定（随机在100到1000之间）
 * 5）在所有文件的uid不能重复
 * 2、读取上一步产生的数据文件重新处理后写到新的文件
 * 1）在读取过程中统计所有文件中不同视频数量出现的次数（比如推荐视频是200个的有多少条记录，类似...）
 * 2）对每一行数据处理要求视频列表保留前160个（小于等于160个的保留原有，大于160的保留前160个）
 * 3）重新处理后保存至新文件，格式与之前的格式保持一致。
 * 考核目标与要求：
 * 1、注意编码规范
 * 2、使用slf4j和logback来记录一些程序运行的监控（比如说耗时或者阶段性运行信息）以及相关要求统计信息
 * 3、结合多线程等相关知识来完成上述需求
 * 4、上述需求可以理解为两步操作，其中每一最大分配堆内存限定在1G，其他参数视自身情况调整
 * 5、结合jvm参数调优、gc日志以及jstat、jstack来调优内存和程序，能够描述好调优的过程以及最终的运行效果
 * Created by hpp on 2017/9/5.
 */
public class GenerateFiles {

    public static void main(String[] args) {

    }

    /**
     * 生成n份满足条件的文件
     * @param fileName 文件名
     */
    public static Boolean gernerateFiles(String fileName, int Max) {
        Boolean flag = true;

        try (
                FileWriter fw = new FileWriter("E:/meituTestFiles/in/" + fileName + ".txt");
                /**
                 * 为了提高写入的效率，使用了字符流的缓冲区。
                 * 创建了一个字符写入流的缓冲区对象，并和指定要被缓冲的流对象相关联。
                 */
                BufferedWriter bufw = new BufferedWriter(fw);

        ) {
            long startTime = System.currentTimeMillis();
            while (Max > 0) {
                bufw.write(gernerateRecord(100, 1000));
                bufw.newLine();
                bufw.flush();
//                fw.write(gernerateRecord(100, 1000));
//                fw.write("\r\n");
                Max--;
            }
            System.out.println("duringTime=" + (System.currentTimeMillis() - startTime));
        } catch (Exception e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    /**
     * 输出视频个数在N和M之间的推荐记录
     *
     * @return String 推荐记录
     */
    public static String gernerateRecord(int N, int M) {

        final int max = 9999;
        final int min = 1000;
        Random randomNum = new Random();
        StringBuilder record = new StringBuilder();
        record.append("u").append(System.currentTimeMillis()).append(randomNum.nextInt(max - min) + min);
        record.append("\t");
        int recordNum = randomNum.nextInt(M - N) + N;
        System.out.println("recordNum = " + recordNum);
        ;
        for (int i = 0; i < recordNum; i++) {
            record.append("m").append(System.currentTimeMillis()).append(randomNum.nextInt(max - min) + min);
            if (i != recordNum - 1) {
                record.append("|");
            }
        }
        return record.toString();
    }


}
